/*******************************************************************************
Module  : Implementation-Datei fuer das Modul "SPI"
Version : 1.0
Date    : 24.06.2007
Author  : Guenther Pammer

Compilerswitches: keine
*******************************************************************************/
#include "spi.h"

/**
* SPI_read_char
* Es wird ein Zeichen aus dem SPI-Datenregister gelesen
               ACHTUNG: Es wird die gesamte Nachricht also ID+DLC+Data geliefert
* \param *data ... Zieladresse des gelesenen Datenbytes
*/
void SPI_read_char  ( unsigned char* byte ){
  SPDAT = 0x00;
  // Wait for transmission complete
  while ( !(SPSTA & SPIF) ) {;}
  *byte = SPDAT;
}

/**
* SPI_write_char
* Es wird ein Zeichen versendet und so lange gewartet bis die
               Daten uebertragen wurden!
* \param data ... Daten die gesendet werden
*/
void SPI_write_char    ( unsigned char byte ) {
   // Start transmission/
   SPDAT = byte;
   // Wait for transmission complete
   while ( !(SPSTA & SPIF) ) {;}
}

/**
* SPI_init
* Initialisierungsroutine zur Parametrierung der SPI-Schniuttstelle
               Daten uebertragen wurden!
* \param clk_division ... Teilungsfaktor fSPI = XTAL / clk_division
*/
void SPI_init        ( unsigned char clk_division ) {                     /* Initialisierung */
  SPCON |= 0x10; /* Master mode */
  P1_1=1; /* enable master */

  switch ( clk_division ) {
   case  4 : SPCON |= 0x01; break;
   case  8 : SPCON |= 0x02; break;
   case 16 : SPCON |= 0x03; break;
   case 32 : SPCON |= 0x80; break;
   case 64 : SPCON |= 0x81; break;
   case 128: SPCON |= 0x82; break;
   // case 2 : see default!! --> SPCON unchanged
   default:
     break;
  }

  SPCON &= ~0x08; /* CPOL=0; transmit mode example */
  SPCON |= 0x04;  /* CPHA=1; transmit mode example */
//  IEN1 |= 0x04;   /* enable spi interrupt */
  SPCON |= 0x40;  /* run spi */

}

